home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / HDX_BACK / HDX302.ST / FMT.BAK < prev    next >
Encoding:
Text File  |  2001-02-09  |  8.6 KB  |  393 lines

  1. /* fmt.c */
  2.  
  3. #include "obdefs.h"
  4. #include "osbind.h"
  5. #include "mydefs.h"
  6. #include "part.h"
  7. #include "hdx.h"
  8. #include "addr.h"
  9. #include "error.h"
  10.  
  11. #define MFM 17            /* sectors per track of MFM */
  12. #define RLL 26            /* sectors per track of RLL */
  13.  
  14. extern long ostack;
  15. extern int typedev;
  16. extern int typedrv;
  17. extern char sbuf[];
  18. extern int rebootp;
  19. extern char ttscsi;        /* 1: SCSI bus drive */
  20.  
  21. /*
  22.  * These constants are used in a heuristic that determines
  23.  * if the format parameter information in the boot sector
  24.  * is intact.  (See fmtpok()).
  25.  */
  26. #define    MAXCYLS        4096        /* max number of cylinders */
  27. #define    MINCYLS        100        /* minimum number of cylinders */
  28. #define    MAXHEADS    16        /* max number of heads */
  29. #define    MINHEADS    2        /* minimum number of heads */
  30. #define    MAXLZ        16        /* max landing zone value */
  31. #define    MAXRT        2        /* max step-rate code */
  32.  
  33.  
  34. /*
  35.  * These are the default format parameters;
  36.  * they are for a 20Mb Mutsubuishi drive.
  37.  *
  38.  * @ If we change drives, this might have to be changed.
  39.  *
  40.  */
  41. HINFO deffmt = {
  42.     0x264,        /* 612 cylinders */
  43.     4,            /* 4 heads */
  44.     0x264,        /* no reduced write-current cylinder */
  45.     0x264,        /* no write precomp cylinder */
  46.     10,            /* landing zone position = 10 */
  47.     2,            /* 2 use buffered seeks */
  48.     1,            /* 2 interleave = 1 */
  49.     17            /* 17 sectors per track */
  50. };
  51.  
  52.  
  53. /*
  54.  * Report format error.
  55.  *
  56.  */
  57. formaterr(dev)
  58. int dev;
  59. {
  60.     char *pdev="X";
  61.     
  62.     *pdev = dev + '0';
  63.     (cantform[FMTDEV].ob_spec)->te_ptext = pdev;
  64.     cantform[FMTERROK].ob_state = NORMAL;
  65.     execform(cantform);
  66.     return ERROR;
  67. }
  68.  
  69.  
  70. /*
  71.  * Set format parameters in a
  72.  * root sector image.
  73.  * 6-13-88  only set size of hard disk.
  74.  *
  75.  */
  76.  
  77. sdisksiz(image, hdsiz)
  78. char *image;
  79. long hdsiz;
  80. {
  81.     ((RSECT *)(image + 0x200 - sizeof(RSECT)))->hd_siz = hdsiz;
  82.  
  83. }
  84.  
  85.  
  86. /*
  87.  * Set format parameters in a
  88.  * root sector image.
  89.  *
  90.  */
  91. sfmtparm(image, fmtparm)
  92. char *image;
  93. HINFO *fmtparm;
  94. {
  95.     register HINFO *rinfo;
  96.     register long siz;
  97.  
  98.     rinfo = &((RSECT *)(image + 0x200 - sizeof(RSECT)))->hd_info;
  99.     rinfo->hi_cc = fmtparm->hi_cc;
  100.     rinfo->hi_dhc = fmtparm->hi_dhc;
  101.     rinfo->hi_rwcc = fmtparm->hi_rwcc;
  102.     rinfo->hi_wpc = fmtparm->hi_wpc;
  103.     rinfo->hi_lz = fmtparm->hi_lz;
  104.     rinfo->hi_rt = fmtparm->hi_rt;
  105.     rinfo->hi_in = fmtparm->hi_in;
  106.     rinfo->hi_spt = fmtparm->hi_spt;
  107.  
  108.     /* Compute total disk size
  109.      * = <#cyls> * <#heads> * <#sectors / track>
  110.      */
  111.     ((RSECT *)(image + 0x200 - sizeof(RSECT)))->hd_siz = 
  112.         (long)fmtparm->hi_cc *
  113.         (long)fmtparm->hi_dhc *
  114.         (long)fmtparm->hi_spt; 
  115.  
  116. }
  117.  
  118.  
  119. /*
  120.  * Determine if format parameters are good;
  121.  * return OK if they appear to be,
  122.  * ERROR if they don't appear to be.
  123.  *
  124.  */
  125. fmtpok(fmtparm)
  126. HINFO *fmtparm;
  127. {
  128.     if (fmtparm->hi_cc > MAXCYLS ||
  129.     fmtparm->hi_cc < MINCYLS ||
  130.     fmtparm->hi_dhc > MAXHEADS ||
  131.     fmtparm->hi_dhc < MINHEADS ||
  132.     fmtparm->hi_lz > MAXLZ ||
  133.     fmtparm->hi_rt > MAXRT)
  134.         return ERROR;
  135.  
  136.     return OK;
  137. }
  138.  
  139.  
  140. /*
  141.  * Setup default format parameters in hinfo;
  142.  * (REAL C compilers do this with a structure assignment...)
  143.  *
  144.  */
  145. fdefault(hinfop)
  146. HINFO *hinfop;
  147. {
  148.     hinfop->hi_cc = deffmt.hi_cc;
  149.     hinfop->hi_dhc = deffmt.hi_dhc;
  150.     hinfop->hi_rwcc = deffmt.hi_rwcc;
  151.     hinfop->hi_wpc = deffmt.hi_wpc;
  152.     hinfop->hi_lz = deffmt.hi_lz;
  153.     hinfop->hi_rt = deffmt.hi_rt;
  154.     hinfop->hi_in = deffmt.hi_in;
  155.     hinfop->hi_spt = deffmt.hi_spt;
  156. }
  157.  
  158.  
  159. /*
  160.  * Set mode information on drive.
  161.  *
  162.  */
  163. ms(dev, hinfo)
  164. int dev;
  165. HINFO *hinfo;
  166. {
  167.     int i;
  168.     char *p;
  169.     SETMODE mb;
  170.     extern long mdselect();
  171.  
  172.     /* initialize parameter structure */
  173.     p = (char *)&mb;
  174.     for (i = sizeof(SETMODE); i--;)
  175.     *p++ = 0;
  176.     mb.smd_8 = 0x08;
  177.     mb.smd_1 = 0x01;
  178.     mb.smd_bs[1] = 0x02;    /* block size = 512 */
  179.  
  180.     cpw(&mb.smd_cc[0], hinfo->hi_cc);
  181.     mb.smd_dhc = hinfo->hi_dhc;
  182.     cpw(&mb.smd_rwc[0], hinfo->hi_rwcc);
  183.     cpw(&mb.smd_wpc[0], hinfo->hi_wpc);
  184.     mb.smd_lz = hinfo->hi_lz;
  185.     mb.smd_rt = hinfo->hi_rt;
  186.  
  187.     return (int)mdselect(dev, 22, &mb);
  188. }
  189.  
  190.  
  191. /*
  192.  * Move `w' to unaligned location.
  193.  *
  194.  */
  195. cpw(d, w)
  196. char *d;
  197. WORD w;
  198. {
  199.     char *s;
  200.  
  201.     s = (char *)&w;
  202.     d[0] = s[0];
  203.     d[1] = s[1];
  204. }
  205.  
  206.  
  207. /*
  208.  * Return format parameters in `hinfo', based on
  209.  * the format parameter name `fpnam'.
  210.  *
  211.  * return 0 on OK,
  212.  * -1 on [CANCEL].
  213.  *
  214.  */
  215. gfparm(dev, noinfo, modesel, hinfop, fpnam, id)
  216. int dev;
  217. int noinfo;            /* 1: no information inside the wincap file */
  218. int *modesel;
  219. HINFO *hinfop;
  220. char *fpnam, *id;
  221. {
  222.     long num;
  223.     char name[128];
  224.     int mask=0x0001;
  225.     int scsidrv, set, ret = OK;
  226.     UWORD cyl; 
  227.     BYTE nhead, sptrk;
  228.  
  229.     set = typedev & (mask << dev);
  230.     scsidrv = typedrv & (mask << dev);
  231.     fdefault(hinfop);
  232.     if ((set) || (scsidrv) || (ttscsi))        {
  233.         *modesel = 0;
  234.     } else if (noinfo)    {
  235.         ret = cyhdsp(dev, &cyl, &nhead, &sptrk);
  236.         hinfop->hi_cc = cyl;
  237.         hinfop->hi_dhc = nhead;
  238.         hinfop->hi_rwcc = cyl;
  239.         hinfop->hi_wpc =  cyl;
  240.         hinfop->hi_spt =  sptrk;
  241.     } else {
  242.  
  243.         strcpy(name, fpnam);
  244.         if (wgetent(fpnam, id) == ERROR) {
  245.             nofmt[NOSCHFOK].ob_state = NORMAL;
  246.             (nofmt[NOSCHFMT].ob_spec)->te_ptext = name;
  247.             execform(nofmt);
  248.             return ERROR;
  249.         }
  250.  
  251.         if (wgetnum("cy", &num) == OK) hinfop->hi_cc = (UWORD)num;
  252.         if (wgetnum("hd", &num) == OK) hinfop->hi_dhc = (BYTE)num;
  253.         if (wgetnum("rw", &num) == OK) hinfop->hi_rwcc = (UWORD)num;
  254.         if (wgetnum("wp", &num) == OK) hinfop->hi_wpc = (UWORD)num;
  255.         if (wgetnum("lz", &num) == OK) hinfop->hi_lz = (BYTE)num;
  256.         if (wgetnum("rt", &num) == OK) hinfop->hi_rt = (BYTE)num;
  257.         if (wgetnum("in", &num) == OK) hinfop->hi_in = (BYTE)num;
  258.         if (wgetnum("sp", &num) == OK) hinfop->hi_spt = (BYTE)num;
  259.         if (wgetnum("md", &num) == OK) *modesel = (UWORD)num;
  260.     }
  261.     return(ret);
  262. }
  263.  
  264.  
  265. /*
  266.  *    Set mode information on a SYQUEST drive.
  267.  *
  268.  */
  269.  
  270. sqms(dev, sendata)
  271. int dev;            /* physical device number */
  272. char sendata[];
  273. {
  274.     extern long mdselect();
  275.     char buf[32];
  276.  
  277.     inquiry(dev, (WORD)16, buf);
  278.     if (buf[8] == 'Q' & buf[9] == 'U' & buf[10] == 'A' & buf[11] == 'N') 
  279.         /* It is a QUANTUM hard disk. So don't need to set the page one. */
  280.         return OK;
  281.     sendata[0] = sendata[2] = 0;    /* reserved */
  282.     sendata[3] = 0x08;                /* block descriptor length */
  283.     sendata[12] = 0;                /* Reserved = 0; Page Code = 0 */
  284.     sendata[13] = 0x02;                
  285.     sendata[14] = 0x10;                /* set inhst bit in page 00 */
  286.     sendata[15] = 0;                /* Device type qualifier  */
  287.     return (int)mdselect(dev, 16, sendata);
  288. }
  289.  
  290.  
  291.  
  292.  
  293. /* 
  294.  * get cylinder, # of head, and sector per track for ST
  295.  */
  296.  
  297. cyhdsp(dev, cyl, nhead, sptk)
  298.  
  299. int dev;
  300. UWORD *cyl; 
  301. BYTE *nhead, *sptk;
  302.  
  303. {
  304.     char *num;
  305.     BYTE sptrk,numhead;
  306.     int i, ret, totcyl, numtrack;
  307.     extern long get3bytes();
  308.     SETMODE *mb;
  309.     SECTOR size, msiz;    /* size of media */
  310.     char buf[512], sendata[32];
  311.     long dmaptr, tmpptr, spcyl;
  312.     char *dmahigh=0xffff8609,
  313.          *dmamid=0xffff860b,
  314.          *dmalow=0xffff860d;
  315.  
  316.     for (i = 0; i < 22; i++)
  317.         sendata[i] = 0;
  318.     ostack = Super(NULL);
  319.     /* get format parameters/ disk size from emdia */
  320.     ret = mdsense(dev, 0, 0, 22, sendata);
  321.     delay();
  322.     Super(ostack);
  323.     if (ret != 0)     {
  324.         return ERROR;
  325.     }
  326.     for (i=0; i<22; i++)    {
  327.         if (sendata[i])
  328.             break;
  329.     }
  330.     if (i == 22)    /* no info return in the buf 'sendata' */
  331.         err(needinfo);
  332.  
  333.        get3bytes(sendata+5);  /* it's adaptec's.  Interpret as SETMODE structure */
  334.       mb = (SETMODE *)sendata;
  335.     /* get number of cylinders */
  336.     totcyl = mb->smd_cc[0];
  337.     totcyl <<= 8;
  338.     totcyl |= mb->smd_cc[1];
  339.     *cyl = (UWORD)totcyl;
  340.  
  341.     /* get number of heads */
  342.     numhead = mb->smd_dhc;
  343.     *nhead = numhead;
  344.   
  345.     sptrk = (long)MFM;
  346.     msiz = (SECTOR)numhead * (SECTOR)totcyl * sptrk;
  347.   
  348.     for (i = 0; i < 20; i++) {
  349.         if ((ret = rdsects(dev, 1, buf, msiz+i)) == OK) {
  350.  
  351.         /* find out whether data has been transferred, by
  352.               checking if dma pointer has been moved.      */
  353.  
  354.                ostack = Super(NULL);    /* get into Supervisor mode */
  355.       
  356.             dmaptr = *dmahigh;
  357.             dmaptr &= 0x0000003f;
  358.             dmaptr <<= 16;
  359.             tmpptr = *dmamid;
  360.             tmpptr &= 0x000000ff;
  361.             tmpptr <<= 8;
  362.             dmaptr |= tmpptr;
  363.             tmpptr = *dmalow;
  364.             tmpptr &= 0x000000ff;
  365.             dmaptr |= tmpptr;
  366.  
  367.             delay();
  368.             Super(ostack);        /* back to user mode */
  369.  
  370.             if (dmaptr != buf)
  371.                 break;
  372.            } else {            /* rdsects return an error */
  373.             if (tsterr(ret) == OK) {
  374.                     break;
  375.             }
  376.            }
  377.     }
  378.  
  379.     if (ret == MDMCHGD)        /* check if error occurred */
  380.         return err(cruptfmt);
  381.  
  382.     /* Determine if media is MFM or RLL */
  383.     if (i < 20)        {
  384.         *sptk = RLL;
  385.     } else {
  386.         *sptk = MFM;
  387.     }
  388.     return OK;
  389. }
  390.  
  391.  
  392.  
  393.